// promise的特点：
// 解决了什么问题：1.链式调用解决嵌套回调的问题。 2. 同步并发问题  3.多个异步处理问题

const fs = require('fs');

// 恶魔金字塔
// fs.readFile('./a.txt', 'utf8', function(err, data) {
//     if (err) return console.log(err);
//     fs.readFile(data, 'utf8', function(err, data) {
//         if (err) return console.log(err);
//         console.log(data);
//     })
// })

// const Promise = require('./src/3.promise.js');

function readFile(filePath, encoding) {
    return new Promise((resolve, reject) => {
        fs.readFile(filePath, encoding, (err, data) => {
            if (err) return reject(err);
            resolve(data);
        })
    })
}

// 1. promise的链式调用，当调用then方法后，会返回一个新的promise。
// 情况1： then中方法返回的是一个普通值（不是promise)的情况，会作为外层下一次then的成功结果。

// let promise = new Promise((resolve) => {
//     resolve('ok');
// }).then((data) => {
//     return 1;
// }, err => {
//     console.log('err', err);
// }).then((data) => {
//     console.log('成功', data); // 成功 1
// }, err => {
//     console.log('err', err);
// })

let promise = new Promise((resolve) => {
    resolve('ok');
})

promise.then((data) => {
    return 1; // 返回值将被忽略，不管是返回数字、字符串还是promise，甚至抛错，都会被忽略
}, err => {
    console.log('err', err);
}).then((data) => {
    console.log('成功', data); // '成功' 'ok'
}, err => {
    console.log('err', err);
})

// 情况2： then中方法执行出错，会走到外层下一次then的失败结果。
// 情况3： 如果then中方法返回的是一个promise对象，此时会根据promise的结果来处理是走成功还是失败





// 如果返回一个普通值（除了promise)，就会传递给下一个then的成功，如果返回一个失败的promise或者抛出异常，会走下一个then的失败
// readFile('./a.txt', 'utf8').then((value) => {
//     return 1;
//     // throw new Error('出错');
// }, (err) => {
//     console.log('fail', err);
// })
// .then((data) => {
//     console.log('成功', data);
// }, () => {
//     console.log('失败');
// });


let promise2 = new Promise((resolve) => {
    resolve(1);
}).then((data) => {
    return new Promise((resolve, reject) => { // x 可能是promise
        setTimeout(() => {
            resolve('ok');
            // reject('错误');
        }, 1000)
    })
})
promise2.then((data) => {
    console.log('成功', data); // 成功  'ok'
}, err => {
    console.log('err', err);
})